Switchlayer ================= 根据索引从输入张量数组中选择一个张量,并将其数据复制到输出。该算子不区分数据类型,适用于所有数据类型。 .. math:: \text{output} = \text{input\_tensors}[\text{index}] 该算子会将选中的输入张量的数据复制到输出张量中。复制的大小为 `size * type_size` 字节。 输入: - **input_tensors** - 输入张量数组(TensorC** 类型),包含多个待选择的张量。 - **index** - 选择的索引(int 类型),指定从 `input_tensors` 数组中选择哪个张量。 - **core_mask** - 核掩码(int),仅共享存储版本需要。 输出: - **output** - 输出张量(TensorC* 类型),包含复制后的数据。输出张量的 `size` 和 `type_size` 应与选中的输入张量相同。 TensorC 结构体定义: - **type_size** - 数据类型大小(long long),单位字节,例如 float32 为 4,float16 为 2。 - **size** - 元素个数(long long)。 - **data** - 数据指针(void*)。 支持平台: ``FT78NE`` ``MT7004`` .. note:: - 该算子不区分数据类型,适用于所有数据类型 - 算子会复制数据,输出张量与输入张量数据独立 - 调用前需要确保 `output->data` 指向的内存空间足够大(至少 `size * type_size` 字节) - 选中的输入张量的 `size` 和 `type_size` 应与输出张量匹配 **共享存储版本:** .. c:function:: void switchlayer_s(TensorC** input_tensors, TensorC* output, int index, int core_mask) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 36 //FT78NE示例 #include #include int main(int argc, char* argv[]) { // 假设在DDR空间 TensorC input0, input1, input2; TensorC output; // 初始化 input0 input0.type_size = 4; // float32 input0.size = 1000; input0.data = (void *)0xA0000000; // 初始化 input1 input1.type_size = 4; // float32 input1.size = 1000; input1.data = (void *)0xA1000000; // 初始化 input2 input2.type_size = 4; // float32 input2.size = 1000; input2.data = (void *)0xA2000000; // 初始化 output output.type_size = 4; // float32 output.size = 1000; output.data = (void *)0xB0000000; // 需要预先分配足够的内存 // 创建输入张量数组 TensorC* input_tensors[3] = {&input0, &input1, &input2}; int index = 1; // 选择 input1 int core_mask = 0xff; switchlayer_s(input_tensors, &output, index, core_mask); // 此时 output.data 包含 input1.data 的副本 return 0; } **私有存储版本:** .. c:function:: void switchlayer_p(TensorC** input_tensors, TensorC* output, int index) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 30 //FT78NE示例 #include #include int main(int argc, char* argv[]) { // 假设在L2空间 TensorC input0, input1, input2; TensorC output; input0.type_size = 4; // float32 input0.size = 1000; input0.data = (void *)0x10000000; input1.type_size = 4; input1.size = 1000; input1.data = (void *)0x10001000; input2.type_size = 4; input2.size = 1000; input2.data = (void *)0x10002000; output.type_size = 4; output.size = 1000; output.data = (void *)0x10003000; // 需要预先分配足够的内存 TensorC* input_tensors[3] = {&input0, &input1, &input2}; int index = 0; // 选择 input0 switchlayer_p(input_tensors, &output, index); return 0; }